package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.TipoLogradouro;
import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Cidade;
import br.com.foxinline.modelo.Dne;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.DneServico;
import br.com.foxinline.util.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author laverson
 */
@ManagedBean
@ViewScoped
public class ManagerDne extends ManagerPesquisarGenerico<Dne> implements Serializable {

    @EJB
    DneServico dneServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    CidadeServico cidadeServico;
    private List<Dne> dneResult;
    private Dne dne;
    private Dne deleteDne;
    private String vDne;
    private Cidade cidade;
    private Bairro bairro;
    private TipoLogradouro tipoLogradouro;

    @PostConstruct
    @Override
    public void init() {
        setServico(dneServico);

        dne = new Dne();
        dne.setCidade(new Cidade());
        dne.setBairro(new Bairro());

        cidade = new Cidade();
        bairro = new Bairro();
        tipoLogradouro = null;

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        vDne = params.get("vDne");
        paramPost();
    }

    public void paramPost() {
        try {
            if (vDne != null) {
                dne = dneServico.find(Long.parseLong(vDne));
                if (dne.getCidade() != null && dne.getCidade().getId() != null) {
                    cidade = cidadeServico.find(dne.getCidade().getId());
                }
                if (dne.getBairro() != null && dne.getBairro().getId() != null) {
                    bairro = bairroServico.find(dne.getBairro().getId());
                }
                tipoLogradouro = dne.getTypePatio();
            }
        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }

    public void salvar() {
        try {
            if (cidade.getId() != null) {
                dne.setCidade(cidade);
            }
            if (bairro.getId() != null) {
                dne.setBairro(bairro);
            }
            dne.setTypePatio(tipoLogradouro);
            dne.setNomeclog(tipoLogradouro.name().concat(" ").concat(dne.getRua()));
            dne.setNomeslog(dne.getRua());
            dneServico.save(dne);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
        init();
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public List<Bairro> autocompleteBairro(String query) {
        return bairroServico.findByName(query, cidade);
    }

    public void setarCidade() {
        if (cidade.getNome() == null) {
            bairro = new Bairro();
        }
    }

    public void clearBairro() {
        if (cidade.getNome() == null) {
            bairro = new Bairro();
        }
    }

    public List<Cidade> autocompleteCidade(String query) {
        return cidadeServico.autocomplete(query);
    }

    @Override
    public void pesquisar() {
        dne.setCidade(cidade);
        dne.setBairro(bairro);

        entidadePesquisar = dne;

        getSearchResults().setFirst(0);
        onLoadModel();

    }

    public void atualizar() {
        try {
            dne.setBairro(bairro);
            dne.setCidade(cidade);
            dne.setTypePatio(tipoLogradouro);
            dne.setNomeslog(dne.getRua());
            dne.setNomeclog(tipoLogradouro.name().concat(" ").concat(dne.getRua()));
            dneServico.update(dne);
            cidade = cidadeServico.find(cidade.getId());
            bairro = bairroServico.find(bairro.getId());
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void remover() {
        dneServico.delete(deleteDne);
        dneResult = new ArrayList<Dne>();
    }

    @Override
    public void limpar() {
        dne = new Dne();
        cidade = new Cidade();
        bairro = new Bairro();
    }

    public List<TipoLogradouro> getTipoLogradouroList() {
        List<TipoLogradouro> items = Arrays.asList(TipoLogradouro.values());
        return items;
    }

    public Dne getDne() {
        return dne;
    }

    public void setDne(Dne dne) {
        this.dne = dne;
    }

    public List<Dne> getDneResult() {
        return dneResult;
    }

    public void setDneResult(List<Dne> dneResult) {
        this.dneResult = dneResult;
    }

    public Dne getDeleteDne() {
        return deleteDne;
    }

    public void setDeleteDne(Dne deleteDne) {
        this.deleteDne = deleteDne;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public TipoLogradouro getTipoLogradouro() {
        return tipoLogradouro;
    }

    public void setTipoLogradouro(TipoLogradouro tipoLogradouro) {
        this.tipoLogradouro = tipoLogradouro;
    }
}
